
import Vue from 'vue'
import VueRouter from 'vue-router';
import routes from './routes';
import store from '@/store'

// 本质在调用插件内部的install方法,只有调用它,插件功能才会添加到Vue身上和Vm身上
Vue.use(VueRouter)

const originPush = VueRouter.prototype.push  //  把原本的push函数地址存起来,防止后面要用
const originReplace = VueRouter.prototype.replace  //  把原本的replace函数地址存起来,防止后面要用
//   把今后使用的push改成我们自己定义的
VueRouter.prototype.push = function (location, resolved, rejected) {
    if (resolved === undefined && rejected === undefined) {
        return originPush.call(this, location).catch(() => { })
    } else {
        return originPush.call(this, location, resolved, rejected)
    }
}
VueRouter.prototype.replace = function (location, resolved, rejected) {
    if (resolved === undefined && rejected === undefined) {
        return originReplace.call(this, location).catch(() => { })
    } else {
        return originReplace.call(this, location, resolved, rejected)
    }
}





// 必须往外暴露一个路由器对象
const router = new VueRouter({
    routes,
    scrollBehavior(to, from, savedPosition) {
        return { x: 0, y: 0 }
    }
})
// 配置全局前置路由导航守卫 

// token校验(在校验的过程当中,就会通过token获取用户信息)
// token使用是需要添加到请求头里面的
router.beforeEach(async (to, from, next) => {
    // 获取用户的token和用户的信息
    let token = store.state.user.token
    let userInfo = store.state.user.userInfo
    // 判断token在不在
    if (token) {
        // 如果token存在  代表用户登录过,但是用户信息在不在不知道
        if (to.path === '/login') {
            // 登陆过有去登录  不应该登录  强制跳转首页
            next('/')
        } else {
            // 登录过  也不是去重复登录  而是去其他的页面
            // 判断用户信息有没有
            if (userInfo.name) {
                // 代表用户登录了  也获取到用户信息了   
                next()
            } else {
                // 代表用户登录了  但是没有获取用户信息  此时需要获取用户信息
                try {
                    // 获取用户信息成功
                    await store.dispatch('getUserInfo')
                    next()
                } catch (error) {
                    //  获取用户信息失败  一般都是token过期
                    //  清空原来的token  重新去登录
                    store.dispatch('resetToken')   // 清空原来的token
                    next('/login')
                }
            }
        }
    } else {
        // 代表token 不存在
        next()
    }

    // 判断token是否存在
    // if (token) {
    //     // token 存在说明登陆过  但是用户信息在不在不知道
    //     if (to.path === '/login') {
    //         // 登录过又去登录  强制跳转到首页
    //         next('/')
    //     } else {
    //         // 登陆过  也不是重复登录 去其他页面
    //         if (userInfo.name) {
    //             // 登陆过  用户信息也存在
    //             next()
    //         } else {
    //             // 登陆过  用户信息不存在  此时需要获取用户信息
    //             try {
    //                 await store.dispatch('getUserInfo')
    //                 next()
    //             } catch (error) {
    //                 // 获取信息失败  一般都是token过期  清空token  跳到登录页
    //                 store.dispatch('resetToken')
    //                 next('login')
    //             }
    //         }
    //     }
    // } else {
    //     // token 不存在 
    //     next()
    // }

    // if(token){
    //     if(to.path === '/login'){
    //         next('/')
    //     }else{
    //         if(userInfo.name){
    //             next()
    //         }else{
    //            try {
    //                await store.dispatch('getUserInfo')
    //                next()
    //            } catch (error) {
    //                store.dispatch('resetToken')
    //                next('/login')
    //            }
    //         }
    //     }
    // }else{
    //     next()
    // }
})


export default router
// 必须在Vue的配置对象总注册路由器对象